/**
 * @developer：MR·Feng
 * 封装axios
 */

import axios from 'axios';
import baseUrl from './baseUrl';

axios.defaults.baseURL = baseUrl.ownUrl; //api前缀

const instance = axios.create({
    timeout: 50000,
    // baseURL: baseUrl.ownUrl
});

//这里我简单列出一些常见的http状态码信息，可以自己去调整配置
const httpCode = {
    400: '请求参数错误',
    401: '未授权, 请重新登录',
    403: '登录过期，请重新登',
    404: '请求资源未找到,请求地址出错,网络请求不存在',
    405: '请求方法未允许',
    408: '请求超时',
    500: '服务器内部错误',
    501: '服务器不支持该请求中使用的方法,服务未实现',
    502: '网关错误',
    503: '服务不可用',
    504: '网关超时',
    505: 'HTTP版本不受支持',
};

const Response = (res) => {
    let tips =
        res.code in httpCode ?
        httpCode[res.code] :
        res.msg || (res.data && res.data.msg);
    if (!['200', 'OK', 200].includes(res.code)) {
        console.info(tips);
    }
    // token或者登陆失效情况下跳转到登录页面，根据实际情况，在这里可以根据不同的响应错误结果，做对应的事。这里我以401判断为例
    if (['403', '401'].includes(res.code)) {
        // 清除token
        localStorage.clear();
        // 用户从新回到登录页面
        setTimeout(() => {
            location.pathname = '/login'; // router是在顶级入口app.js文件定义了window._ROUTER_ = this.props.history;
        }, 1000);
    }
};

instance.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';
instance.defaults.headers.post['Accept'] = 'application/json,text/plain,*/*';
instance.defaults.headers.post['credentials'] = 'include';

// 拦截request, 设置全局请求为ajax请求
instance.interceptors.request.use(
    (request) => {
        let token = sessionStorage.getItem('token');
        if (token) {
            // 判断是否存在token，如果存在的话，则每个http header都加上token
            request.headers.Authorization = `Bearer ${token}`;
        }
        return request;
    },
    (error) => {
        return Promise.reject(error);
    },
);

instance.interceptors.response.use(
    (response) => {
        let res = response.data;
        Response(res);
        return response.data;
    },
    (error) => {
        // 这里是返回状态码不为200时候的错误处理
        if (error && error.response) {
            let res = error.response;
            Response(res);
        } else {
            // 跨域获取不到状态码或者其他状态码经行处阿狸
            console.error('网络出现问题，请稍后重试');
        }

        return Promise.reject(error.msg);
    },
);

export default instance;
